package com.episode2;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class BasicServlet
 */
public class BasicServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
//	private static final String DEF_ENC = "ISO-8859-1";

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// response တွင် ယူနီကုဒ် Encoding အဖြစ် သတ်မှတ်ခြင်း
		response.setCharacterEncoding("UTF-8");
		
		// request တွင်ပါဝင်သော parameter အမည်များကို ရယူခြင်း
		@SuppressWarnings("unchecked")
		Enumeration<String> params = request.getParameterNames();
		
		// request မှ header အမည်ရှိသော parameter ၏ တန်ဖိုးကို ထုတ်ယူခြင်း
		String isHeader = request.getParameter("header");
		
		// parameter အမည်များမရရှိခဲ့ပါက
		if(null == params || !params.hasMoreElements()) {
			// အခန်း ၁ လုပ်ဆောင်ချက်ကို ခေါ်ယူခြင်း
			this.doInitParamProcess(request, response);
		} else {
			// header ၏တန်ဖိုးသည် 1 ဖြစ်ပါက
			if("1".equals(isHeader) ) {
				// အခန်း ၃ လုပ်ဆောင်ချက်ကိုခေါ်ယူခြင်း
				this.doHeaderInfoProcess(request, response);
			} else {
				// အခန်း ၂ လုပ်ဆောင်ချက်ကို ခေါ်ယူခြင်း
				this.doRequestParamProcess(request, response);
			}
		}
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request, response);
	}
	
	/**
	 * အခန်း ၁ လုပ်ဆောင်ချက်
	 * @param request
	 * @param response
	 * @throws IOException 
	 */
	private void doInitParamProcess(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		
		PrintWriter writer = response.getWriter();
		writer.println(getHeaderHtml("လေ့ကျင့်ခန်း ၁ ။   ။ Init Parameters များကို အသုံးပြုခြင်း။"));
		writer.println("<p>web.xml ၏ init-param ၏ တန်ဖိုးများဖြစ်ကြပါသည်။</p>");
		writer.println("<ul>");

		// init-param အမည်များကို ရယူခြင်း
		@SuppressWarnings("unchecked")
		Enumeration<String> names = getInitParameterNames();
		// init-param အမည်များ မကုန်မချင်း
			while(names.hasMoreElements()) {
				String name = names.nextElement();
				writer.println("<li>");
				// init-param အမည်နှင့် တန်ဖိုးကိုရေးသားခြင်း
				writer.println(name + " : " + getInitParameter(name));
				writer.println("</li>");
			}
		writer.println("</ul>");
		writer.println(getFooterHtml());
	}
	
	/**
	 * အခန်း၂ လုပ်ဆောင်ချက်
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void doRequestParamProcess(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		PrintWriter writer = response.getWriter();
		writer.println(getHeaderHtml("လေ့ကျင့်ခန်း ၂ ။   ။ Request Parameters များကို အသုံးပြုခြင်း။"));
		writer.println("<p>Request Parameter ၏ တန်ဖိုးများဖြစ်ကြပါသည်။</p>");
		writer.println("<ul>");

		// request တွင်ပါဝင်သော parameter အမည်များကို ရယူခြင်း
		@SuppressWarnings("unchecked")
		Enumeration<String> params = request.getParameterNames();
		while(params.hasMoreElements()) {
			String name = params.nextElement();
			writer.println("<li>");
			String value =  request.getParameter(name);
//			System.out.println(value);
//			value = new String(value.getBytes(DEF_ENC), "UTF-8");
			// param အမည်နှင့် တန်ဖိုးကိုရေးသားခြင်း
			writer.println(name + " : " + value);
			writer.println("</li>");
		}
		writer.println("</ul>");
		writer.println(getFooterHtml());
	}
	
	/**
	 * အခန်း၃ လုပ်ဆောင်ချက်
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void doHeaderInfoProcess(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		PrintWriter writer = response.getWriter();
		writer.println(getHeaderHtml("လေ့ကျင့်ခန်း ၃ ။   ။ Header ၏တန်ဖိုးများကို အသုံးပြုခြင်း။"));
		writer.println("<p>Request Headerတွင်ပါဝင်သော တန်ဖိုးများဖြစ်ကြပါသည်။</p>");
		writer.println("<ul>");
		// request တွင်ပါဝင်သော Header အမည်များကို ရယူခြင်း
		@SuppressWarnings("unchecked")
		Enumeration<String> names = request.getHeaderNames();
		while(names.hasMoreElements()) {
			String name = names.nextElement();
			writer.println("<li>");
			// အမည်နှင့် တန်ဖိုးကိုရေးသားခြင်း
			writer.println(name + " : " + request.getHeader(name));
			writer.println("</li>");
		}
		writer.println("</ul>");
		writer.println(getFooterHtml());
	}
	
	/**
	 * အထက်ပိုင်း HTML စာသားများကိုရယူခြင်း
	 * @param title
	 * @return
	 */
	private static String getHeaderHtml(String title) {
		StringBuilder sb = new StringBuilder("<!DOCTYPE html>");
		sb.append("<html>");
		sb.append("<head>");
		sb.append("<meta charset='UTF-8'>");
		sb.append("<title>Episode 2</title>");
		sb.append("<link rel=\"stylesheet\" href=\"/theme/episode.css\" type=\"text/css\" />");
		sb.append("</head>");
		sb.append("<body style='font-family:Myanmar3'>");
		sb.append("<div style='float:right'><a href='/page/episode2.html'>မာတိကာသို့</a></div>");
		sb.append("<h2>");
		sb.append(title);
		sb.append("</h2>");
		return sb.toString();
	}
	
	/**
	 * အောက်ပိုင်း HTML စာသားများကို ရယူခြင်း
	 * @return
	 */
	private static String getFooterHtml() {
		return "</body></html>";
	}
	
}
